package com.bitoon.basketdudes.web.jpa;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.*;

@Entity
@Table(name = "partido", schema="basket")

@NamedNativeQueries({
    @NamedNativeQuery(name = "Partido.findPasados", query = "SELECT * FROM BASKET.PARTIDO WHERE F_PARTIDO <= CURRENT_TIMESTAMP AND F_PARTIDO >= CURRENT_TIMESTAMP - INTERVAL '2 days' ORDER BY F_PARTIDO DESC", resultClass = Partido.class),
    @NamedNativeQuery(name = "Partido.findPasadosByEquipoId", query = "SELECT * FROM PARTIDO WHERE (EQUIPO_ID1 = :equipoId OR EQUIPO_ID2 = :equipoId) AND F_PARTIDO <= CURRENT_TIMESTAMP AND F_PARTIDO >= CURRENT_TIMESTAMP - INTERVAL '30 days' AND TIPO <> 4 ORDER BY F_PARTIDO DESC", resultClass = Partido.class),
    @NamedNativeQuery(name = "Partido.findFuturosByEquipoId", query = "SELECT * FROM PARTIDO WHERE (EQUIPO_ID1 = :equipoId OR EQUIPO_ID2 = :equipoId) AND F_PARTIDO > CURRENT_TIMESTAMP ORDER BY F_PARTIDO", resultClass = Partido.class),
    @NamedNativeQuery(name = "Partido.findById", query = "SELECT * FROM PARTIDO WHERE (ID = :partidoId)", resultClass = Partido.class),
    @NamedNativeQuery(name = "Partido.findAllFromUser", query = "SELECT * FROM BASKET.PARTIDO WHERE (EQUIPO_ID1 = :equipoId OR EQUIPO_ID2 = :equipoId) ORDER BY F_PARTIDO DESC", resultClass = Partido.class)
})

@NamedQueries({

    /*
    @NamedQuery(name = "Partido.findAll", query = "SELECT p FROM Partido p"),
    @NamedQuery(name = "Partido.findById", query = "SELECT p FROM Partido p WHERE p.id = :id"),
    @NamedQuery(name = "Partido.findByJornadaId", query = "SELECT p FROM Partido p WHERE p.jornadaId = :jornadaId"),
    @NamedQuery(name = "Partido.findByEquipoId1", query = "SELECT p FROM Partido p WHERE p.equipoId1 = :equipoId1"),
    @NamedQuery(name = "Partido.findByEquipoId2", query = "SELECT p FROM Partido p WHERE p.equipoId2 = :equipoId2"),
     *
     */
    @NamedQuery(name = "Partido.findByEquipoId", query = "SELECT p FROM Partido p WHERE p.equipo1.id = :equipoId OR p.equipo2.id = :equipoId"),
    @NamedQuery(name = "Partido.findByEquipoNombre", query = "SELECT p FROM Partido p WHERE (LOWER(p.equipo1.nombre) LIKE :nombre OR LOWER(p.equipo1.nick) LIKE :nombre OR LOWER(p.equipo2.nombre) LIKE :nombre OR LOWER(p.equipo2.nick) LIKE :nombre) order by p.fecha DESC"),
    @NamedQuery(name = "Partido.findByManagerNick", query = "SELECT p FROM Partido p WHERE (LOWER(p.equipo1.usuario.nickMostrar) LIKE :nick OR LOWER(p.equipo2.usuario.nickMostrar) LIKE :nick) order by p.fecha DESC"),
    @NamedQuery(name = "Partido.findByFechaEquipo", query = "SELECT p FROM Partido p WHERE (p.fecha >= :fecha_ini AND p.fecha <= :fecha_fin) AND (LOWER(p.equipo1.nombre) LIKE :nombre OR LOWER(p.equipo1.nick) LIKE :nombre OR LOWER(p.equipo2.nombre) LIKE :nombre OR LOWER(p.equipo2.nick) LIKE :nombre) order by p.fecha DESC"),
    @NamedQuery(name = "Partido.findByFechaManager", query = "SELECT p FROM Partido p WHERE (p.fecha >= :fecha_ini AND p.fecha <= :fecha_fin) AND ( LOWER(p.equipo1.usuario.nickMostrar) LIKE :nick OR LOWER(p.equipo2.usuario.nickMostrar) LIKE :nick) order by p.fecha DESC")

    /*
     * Cambiado por Native Query - 31.3.2011
     */
    //@NamedQuery(name = "Partido.findPasadosLimit", query = "SELECT p FROM Partido p WHERE p.fecha <= CURRENT_TIMESTAMP ORDER BY p.fecha DESC")

    /*
    @NamedQuery(name = "Partido.findByEstado", query = "SELECT p FROM Partido p WHERE p.estado = :estado"),
    @NamedQuery(name = "Partido.findByFecha", query = "SELECT p FROM Partido p WHERE p.fecha = :fecha"),
    @NamedQuery(name = "Partido.findByPuntos1", query = "SELECT p FROM Partido p WHERE p.puntos1 = :puntos1"),
    @NamedQuery(name = "Partido.findByPuntos2", query = "SELECT p FROM Partido p WHERE p.puntos2 = :puntos2"),
    @NamedQuery(name = "Partido.findByPos1Ini", query = "SELECT p FROM Partido p WHERE p.pos1Ini = :pos1Ini"),
    @NamedQuery(name = "Partido.findByPos2Ini", query = "SELECT p FROM Partido p WHERE p.pos2Ini = :pos2Ini"),
    @NamedQuery(name = "Partido.findByPos1Fin", query = "SELECT p FROM Partido p WHERE p.pos1Fin = :pos1Fin"),
    @NamedQuery(name = "Partido.findByPos2Fin", query = "SELECT p FROM Partido p WHERE p.pos2Fin = :pos2Fin"),
    @NamedQuery(name = "Partido.findByMinutosJugados", query = "SELECT p FROM Partido p WHERE p.minutosJugados = :minutosJugados"),
    @NamedQuery(name = "Partido.findByTipo", query = "SELECT p FROM Partido p WHERE p.tipo = :tipo")
     * 
     */

})
public class Partido implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @Column(name = "jornada_id")
    private int jornadaId;
    
    @ManyToOne
    @JoinColumn(name = "equipo_id1", referencedColumnName = "id")
    private EquipoRanking equipo1;
    
    @ManyToOne
    @JoinColumn(name = "equipo_id2", referencedColumnName = "id")
    private EquipoRanking equipo2;

    @Basic(optional = false)
    @Column(name = "estado")
    private short estado;

    @Column(name = "f_partido")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecha;

    @Basic(optional = false)
    @Column(name = "puntos1")
    private short puntos1;

    @Basic(optional = false)
    @Column(name = "puntos2")
    private short puntos2;

    @Basic(optional = false)
    @Column(name = "pos1_ini")
    private int pos1Ini;

    @Basic(optional = false)
    @Column(name = "pos2_ini")
    private int pos2Ini;

    @Basic(optional = false)
    @Column(name = "pos1_fin")
    private int pos1Fin;

    @Basic(optional = false)
    @Column(name = "pos2_fin")
    private int pos2Fin;

    @Basic(optional = false)
    @Column(name = "minutos_jugados")
    private int minutosJugados;

    @Basic(optional = false)
    @Column(name = "tipo")
    private short tipo;

    @Basic(optional = false)
    @Column(name = "t11")
    private short t11;

    @Basic(optional = false)
    @Column(name = "t12")
    private short t12;

    @Basic(optional = false)
    @Column(name = "t13")
    private short t13;

    @Basic(optional = false)
    @Column(name = "t14")
    private short t14;

    @Basic(optional = false)
    @Column(name = "t21")
    private short t21;

    @Basic(optional = false)
    @Column(name = "t22")
    private short t22;

    @Basic(optional = false)
    @Column(name = "t23")
    private short t23;

    @Basic(optional = false)
    @Column(name = "t24")
    private short t24;

    @Basic(optional = false)
    @Column(name = "minutos")
    private short minutos;

    public Partido() {
    }

    public Partido(Integer id) {
        this.id = id;
    }

    /*
    public Partido(Integer id, int jornadaId, int equipoId1, int equipoId2, short estado, short puntos1, short puntos2, int pos1Ini, int pos2Ini, int pos1Fin, int pos2Fin, int minutosJugados, short tipo) {
        this.id = id;
        this.jornadaId = jornadaId;
        //this.equipoId1 = equipoId1;
        this.equipoId2 = equipoId2;
        this.estado = estado;
        this.puntos1 = puntos1;
        this.puntos2 = puntos2;
        this.pos1Ini = pos1Ini;
        this.pos2Ini = pos2Ini;
        this.pos1Fin = pos1Fin;
        this.pos2Fin = pos2Fin;
        this.minutosJugados = minutosJugados;
        this.tipo = tipo;
    }
     *
     */

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getJornadaId() {
        return jornadaId;
    }

    public void setJornadaId(int jornadaId) {
        this.jornadaId = jornadaId;
    }

    /*
    public int getEquipoId1() {
        return equipoId1;
    }

    public void setEquipoId1(int equipoId1) {
        this.equipoId1 = equipoId1;
    }
     *
     */

    public EquipoRanking getEquipo1() {
        return this.equipo1;
    }

    public void setEquipo1(EquipoRanking equipo) {
        this.equipo1 = equipo;
    }

    /*
    public int getEquipoId2() {
        return equipoId2;
    }

    public void setEquipoId2(int equipoId2) {
        this.equipoId2 = equipoId2;
    }
     *
     */

    public EquipoRanking getEquipo2() {
        return this.equipo2;
    }

    public void setEquipo2(EquipoRanking equipo) {
        this.equipo2 = equipo;
    }

    public short getEstado() {
        return estado;
    }

    public void setEstado(short estado) {
        this.estado = estado;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public String getFechaLink() {
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        return df.format(fecha);
    }

    public short getPuntos1() {
        return puntos1;
    }

    public void setPuntos1(short puntos1) {
        this.puntos1 = puntos1;
    }

    public short getPuntos2() {
        return puntos2;
    }

    public void setPuntos2(short puntos2) {
        this.puntos2 = puntos2;
    }

    public int getPos1Ini() {
        return pos1Ini;
    }

    public void setPos1Ini(int pos1Ini) {
        this.pos1Ini = pos1Ini;
    }

    public int getPos2Ini() {
        return pos2Ini;
    }

    public void setPos2Ini(int pos2Ini) {
        this.pos2Ini = pos2Ini;
    }

    public int getPos1Fin() {
        return pos1Fin;
    }

    public void setPos1Fin(int pos1Fin) {
        this.pos1Fin = pos1Fin;
    }

    public int getPos2Fin() {
        return pos2Fin;
    }

    public void setPos2Fin(int pos2Fin) {
        this.pos2Fin = pos2Fin;
    }

    public int getMinutosJugados() {
        return minutosJugados;
    }

    public void setMinutosJugados(int minutosJugados) {
        this.minutosJugados = minutosJugados;
    }

    public short getTipo() {
        return tipo;
    }

    public void setTipo(short tipo) {
        this.tipo = tipo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Partido)) {
            return false;
        }
        Partido other = (Partido) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.bitoon.basketdudes.web.jpa.Partido[id=" + id + "]";
    }

    public short getT11() {
        return t11;
    }

    public void setT11(short t11) {
        this.t11 = t11;
    }

    public short getT12() {
        return t12;
    }

    public void setT12(short t12) {
        this.t12 = t12;
    }

    public short getT13() {
        return t13;
    }

    public void setT13(short t13) {
        this.t13 = t13;
    }

    public short getT14() {
        return t14;
    }

    public void setT14(short t14) {
        this.t14 = t14;
    }

    public short getT21() {
        return t21;
    }

    public void setT21(short t21) {
        this.t21 = t21;
    }

    public short getT22() {
        return t22;
    }

    public void setT22(short t22) {
        this.t22 = t22;
    }

    public short getT23() {
        return t23;
    }

    public void setT23(short t23) {
        this.t23 = t23;
    }

    public short getT24() {
        return t24;
    }

    public void setT24(short t24) {
        this.t24 = t24;
    }

    public short getMinutos() {
        return minutos;
    }

    public void setMinutos(short minutos) {
        this.minutos = minutos;
    }

    /*public UsuarioParcial getUsuarioQueAbandono(){
        //devolvemos el usuario que abandonó un partido
        if(equipo1.getUsuario().getId()==getAbandonador()){
            return equipo1.getUsuario();
        }else {
            return equipo2.getUsuario();
        }
    }*/


}
